package com.thinkgsp.jxc.persistence;

import java.math.BigDecimal;
import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.thinkgsp.jxc.model.RpContactBalance;
import com.thinkgsp.jxc.model.RpCustomerContact;

/**
 * 往来余额表持久化类
 * @author evan
 *
 */
public interface ContactBalanceMapper {

	/**
	 * 根据Id获取往来余额对象
	 * @param id
	 * @return
	 */
	public RpContactBalance getContactBalance(Long id);
	
	/**
	 * 获取往来余额列表
	 * @param direct  方向  1 =应收；-1=应付
	 * @param begPeriod 开始期间 格式 : 2013.01
	 * @param endPeriod 截止期间 格式 : 2013.12
	 * @return
	 */
	public List<RpContactBalance> getContactBalanceList(@Param(value="direct")Integer direct,@Param(value="begPeriod")BigDecimal begPeriod,@Param(value="endPeriod")BigDecimal endPeriod);
	
	/**
	 * 获取指定客户的往来余额列表
	 * @param direct 方向  1 =应收；-1=应付
	 * @param begPeriod 开始期间 格式 : 2013.01
	 * @param endPeriod 截止期间 格式 : 2013.12
	 * @param custId 客户Id
	 * @return
	 */
	public List<RpContactBalance> getContactBalanceListByCust(@Param(value="direct")Integer direct,@Param(value="begPeriod")BigDecimal begPeriod,@Param(value="endPeriod")BigDecimal endPeriod,@Param(value="custId")Integer custId);
	
	/**
	 * 根据核算项目-职员获取往来余额,
	 * @param direct 方向 1 =应收；-1=应付
	 * @param fyear 年份
	 * @param period 期间
	 * @param custId 客户Id
	 * @param deptId 部门Id
	 * @param empId 职员Id
	 * @return
	 */
	public RpContactBalance findContactBalanceByEmp(@Param(value="direct")Integer direct,@Param(value="fyear")Integer fyear,@Param(value="period")Integer period,@Param(value="custId")Integer custId,@Param(value="deptId")Integer deptId,@Param(value="empId")Integer empId);
	
	/**
	 * 根据核算项目-部门获取往来余额
	 * @param direct 方向 1 = 应收; -1 = 应付
	 * @param fyear 年份
	 * @param period 期间
	 * @param custId 客户Id
	 * @param deptId 部门Id
	 * @return
	 */
	public RpContactBalance findContactBalanceByDept(@Param(value="direct")Integer direct,@Param(value="fyear")Integer fyear,@Param(value="period")Integer period,@Param(value="custId")Integer custId,@Param(value="deptId")Integer deptId);
	
	/**
	 * 根据核算项目-客户获取往来余额
	 * @param direct 方向 1 = 应收; -1 = 应付
	 * @param fyear 年份
	 * @param period 期间
	 * @param custId 客户Id
	 * @return
	 */
	public RpContactBalance findContactBalanceByCust(@Param(value="direct")Integer direct,@Param(value="fyear")Integer fyear,@Param(value="period")Integer period,@Param(value="custId")Integer custId);
	
	/**
	 * 获取客户的应收应付往来明细
	 * @param begPeriod 开始期间 格式 : 2013.01
	 * @param endPeriod 截止期间 格式 : 2013.12
	 * @return
	 */
	public List<RpCustomerContact> findCustomerContact(@Param(value="begPeriod") BigDecimal begPeriod,@Param(value="endPeriod") BigDecimal endPeriod,@Param(value="custId") Integer custId);
	
	/**
	 * 初始化往来余额，核算项目-职员
	 * @param direct  方向 1 = 应收; -1 = 应付
	 * @param fyear 年份
	 * @param period 期间
	 * @param custId 客户
	 * @param deptId 部门
	 * @param empId 职员
	 * @param amount 初始化余额
	 */
	public void initContactBalanceByEmp(@Param(value="direct")Integer direct,@Param(value="fyear")Integer fyear,@Param(value="period")Integer period,@Param(value="custId")Integer custId,@Param(value="deptId")Integer deptId,@Param(value="empId")Integer empId,@Param(value="amount")BigDecimal amount);
	
	/**
	 * 初始化往来余额，核算项目-部门
	 * @param direct 方向 1 = 应收; -1 = 应付
	 * @param fyear 年份
	 * @param period 期间
	 * @param custId 客户
	 * @param deptId 部门
	 * @param amount 初始化余额
	 */
	public void initContactBalanceByDept(@Param(value="direct")Integer direct,@Param(value="fyear")Integer fyear,@Param(value="period")Integer period,@Param(value="custId")Integer custId,@Param(value="deptId")Integer deptId,@Param(value="amount")BigDecimal amount);
	
	/**
	 * 初始化往来余额，核算项目-客户
	 * @param direct 方向 1 = 应收; -1 = 应付
	 * @param fyear 年份
	 * @param period 期间
	 * @param custId 客户
	 * @param amount 初始化余额
	 * @param deptId 部门ID,用于区分不同部门之间的客户往来余额
	 */
	public void initContactBalanceByCust(@Param(value="direct")Integer direct,@Param(value="fyear")Integer fyear,@Param(value="period")Integer period,@Param(value="custId")Integer custId,@Param(value="deptId")Integer deptId,@Param(value="amount")BigDecimal amount);
	
	/**
	 * 登记应收账款借方
	 * @param id 往来表Id
	 * @param amount 借方金额
	 * @return
	 */
	public int recordAccountsReceivableForDebit(@Param(value="id")Long id,@Param(value="amount")BigDecimal amount);

	/**
	 * 登记应收账款贷方
	 * @param id 往来表Id
	 * @param amount 贷方金额
	 * @return
	 */
	public int recordAccountsReceivableForCredit(@Param(value="id")Long id,@Param(value="amount")BigDecimal amount);
	
	/**
	 * 登记应付账款借方
	 * @param id 往来表Id
	 * @param amount 借方金额
	 * @return
	 */
	public int recordAccountsPayableForDebit(@Param(value="id")Long id,@Param(value="amount")BigDecimal amount);
	
	/**
	 * 登记应付账款贷方
	 * @param id 往来表Id
	 * @param amount 贷方金额
	 * @return
	 */
	public int recordAccountsPayableForCredit(@Param(value="id")Long id,@Param(value="amount")BigDecimal amount);
	
	/**
	 * 期末转账
	 * @param curYear 当前年份
	 * @param curPeriod 当前期间
	 * @param nextYear 下期年份
	 * @param nextPeriod 下期期间
	 */
	public void periodEndForward(@Param(value="curYear")Integer curYear,@Param(value="curPeriod")Integer curPeriod,@Param(value="nextYear")Integer nextYear,@Param(value="nextPeriod")Integer nextPeriod);
	
	/**
	 * 清空往来余额表
	 */
	public void clearContactBalance();
	
}
